import 'package:flutter/material.dart';

class MathFormulaWidget extends StatelessWidget {
  final String content;
  final TextStyle? style;
  final int? maxLines;
  final TextOverflow overflow;

  const MathFormulaWidget({
    Key? key,
    required this.content,
    this.style,
    this.maxLines,
    this.overflow = TextOverflow.ellipsis,
  }) : super(key: key);

  @override
  Widget build(BuildContext context) {
    // 处理文本，替换<br>为换行符
    final processedText = content.replaceAll('<br>', '\n');
    
    // 检查是否包含括号中的分数
    if (_containsBracketFraction(processedText)) {
      return _buildRichText(processedText, context);
    } else {
      // 直接显示普通文本
      return _buildText(processedText, context);
    }
  }
  
  Widget _buildText(String text, BuildContext context) {
    return Container(
      constraints: BoxConstraints(
        maxWidth: MediaQuery.of(context).size.width,
      ),
      child: Text(
        text,
        style: style ?? const TextStyle(color: Colors.black),
        maxLines: maxLines,
        overflow: maxLines != null ? overflow : TextOverflow.visible,
        textAlign: TextAlign.left,
      ),
    );
  }
  
  // 检查文本中是否包含括号中的分数
  bool _containsBracketFraction(String text) {
    // 匹配各种分数格式，包括中文、字母和特殊格式
    // 注意：按照从具体到一般的顺序排列，避免被宽泛的正则表达式误匹配
    final bracketFractionRegex = RegExp(
      // ((1+2)/(1+2)) 格式 - 分子分母都带括号（最具体的格式）
      r'[\(（][\s]*\([\s]*\d+\+\d+[\s]*\)[\s]*/[\s]*\([\s]*\d+\+\d+[\s]*\)[\s]*[\)）]|'
      // ((1+2)/2) 格式 - 分子带括号
      r'[\(（][\s]*\([\s]*\d+\+\d+[\s]*\)[\s]*/[\s]*\d+[\s]*[\)）]|' 
      // (2/(1+2)) 格式 - 分母带括号
      r'[\(（][\s]*\d+[\s]*/[\s]*\([\s]*\d+\+\d+[\s]*\)[\s]*[\)）]|' 
      // ((1 + r)/现期量) 格式 - 分子带括号，支持中文和字母
      r'[\(（][\s]*\([\s]*[^\(\)（）/]+[\s]*\)[\s]*/[\s]*[^\(\)（）/]+[\s]*[\)）]|'
      // (现期量/(1 + r)) 格式 - 分母带括号，支持中文和字母
      r'[\(（][\s]*[^\(\)（）/]+[\s]*/[\s]*\([\s]*[^\(\)（）/]+[\s]*\)[\s]*[\)）]|'
      // （1/2）格式 - 简单数字分数（优先匹配纯数字分数）
      r'[\(（][\s]*\d+[\s]*/[\s]*\d+[\s]*[\)）]|' 
      // (总增长量/n年) 格式 - 支持中文和字母的简单分数（最宽泛的格式）
      r'[\(（][\s]*[^\(\)（）/]+[\s]*/[\s]*[^\(\)（）/]+[\s]*[\)）]'
    );
    return bracketFractionRegex.hasMatch(text);
  }
  
  // 构建富文本，处理括号中的分数
  Widget _buildRichText(String text, BuildContext context) {
    // 添加null和空字符串检查
    if (text.isEmpty) {
      return _buildText('', context);
    }
    
    // 添加style的null检查
    final TextStyle safeStyle = style ?? const TextStyle(fontSize: 16.0);
    
    final List<InlineSpan> spans = [];
    // 匹配所有支持的分数格式
    final simpleNumberFractionRegex = RegExp(r'[\(（]([\s]*(\d+)[\s]*/[\s]*(\d+)[\s]*)[\)）]'); // （1/2）格式
    final numeratorWithParenRegex = RegExp(r'[\(（]([\s]*\([\s]*(\d+\+\d+)[\s]*\)[\s]*/[\s]*(\d+)[\s]*)[\)）]'); // ((1+2)/2) 格式
    final denominatorWithParenRegex = RegExp(r'[\(（]([\s]*(\d+)[\s]*/[\s]*\([\s]*(\d+\+\d+)[\s]*\)[\s]*)[\)）]'); // (2/(1+2)) 格式
    final bothParenRegex = RegExp(r'[\(（]([\s]*\([\s]*(\d+\+\d+)[\s]*\)[\s]*/[\s]*\([\s]*(\d+\+\d+)[\s]*\)[\s]*)[\)）]'); // ((1+2)/(1+2)) 格式
    
    // 支持中文和字母的分数格式
    final chineseNumeratorRegex = RegExp(r'[\(（]([\s]*(\([^\(\)（）/]+\))[\s]*/[\s]*([^\(\)（）/]+)[\s]*)[\)）]'); // ((1 + r)/现期量) 格式
    final chineseDenominatorRegex = RegExp(r'[\(（]([\s]*([^\(\)（）/]+)[\s]*/[\s]*(\([^\(\)（）/]+\))[\s]*)[\)）]'); // (现期量/(1 + r)) 格式
    final simpleChineseFractionRegex = RegExp(r'[\(（]([\s]*([^\(\)（）/]+)[\s]*/[\s]*([^\(\)（）/]+)[\s]*)[\)）]'); // (总增长量/n年) 格式
    
    // 分割文本，处理每个部分
    int lastMatchEnd = 0;
    
    try {
      // 处理所有匹配项
      final allMatches = [
        ...simpleNumberFractionRegex.allMatches(text),
        ...numeratorWithParenRegex.allMatches(text),
        ...denominatorWithParenRegex.allMatches(text),
        ...bothParenRegex.allMatches(text),
        ...chineseNumeratorRegex.allMatches(text),
        ...chineseDenominatorRegex.allMatches(text),
        ...simpleChineseFractionRegex.allMatches(text),
      ];
      
      // 按照匹配位置排序
      allMatches.sort((a, b) => a.start.compareTo(b.start));
      
      // 处理重叠匹配
      final List<RegExpMatch> filteredMatches = [];
      RegExpMatch? lastMatch;
      
      for (final match in allMatches) {
        if (lastMatch == null || match.start >= lastMatch.end) {
          filteredMatches.add(match);
          lastMatch = match;
        }
      }
      
      for (final match in filteredMatches) {
        // 添加分数前的文本
        if (match.start > lastMatchEnd && match.start <= text.length) {
          final startIndex = lastMatchEnd.clamp(0, text.length);
          final endIndex = match.start.clamp(0, text.length);
          if (startIndex < endIndex && startIndex >= 0 && endIndex <= text.length) {
            try {
              spans.add(TextSpan(
                text: text.substring(startIndex, endIndex),
                style: safeStyle,
              ));
            } catch (e) {
              // 如果substring失败，跳过这部分
              print('Error in substring: $e, startIndex: $startIndex, endIndex: $endIndex, text.length: ${text.length}');
            }
          }
        }
        
        String? numerator;
        String? denominator;
        
        // 检查是哪种分数格式并提取分子和分母
        if (match.pattern == simpleNumberFractionRegex) {
          // （1/2）格式
          final num = match.group(2);
          final den = match.group(3);
          numerator = num?.trim();
          denominator = den?.trim();
        } else if (match.pattern == numeratorWithParenRegex) {
          // ((1+2)/2) 格式
          final num = match.group(2);
          final den = match.group(3);
          numerator = num != null ? '(${num.trim()})' : null;
          denominator = den?.trim();
        } else if (match.pattern == denominatorWithParenRegex) {
          // (2/(1+2)) 格式
          final num = match.group(2);
          final den = match.group(3);
          numerator = num?.trim();
          denominator = den != null ? '(${den.trim()})' : null;
        } else if (match.pattern == bothParenRegex) {
          // ((1+2)/(1+2)) 格式
          final num = match.group(2);
          final den = match.group(3);
          numerator = num != null ? '(${num.trim()})' : null;
          denominator = den != null ? '(${den.trim()})' : null;
        } else if (match.pattern == chineseNumeratorRegex) {
          // ((1 + r)/现期量) 格式
          final num = match.group(2);
          final den = match.group(3);
          numerator = num?.trim();
          denominator = den?.trim();
        } else if (match.pattern == chineseDenominatorRegex) {
          // (现期量/(1 + r)) 格式
          final num = match.group(2);
          final den = match.group(3);
          numerator = num?.trim();
          denominator = den?.trim();
        } else if (match.pattern == simpleChineseFractionRegex) {
          // (总增长量/n年) 格式
          final num = match.group(2);
          final den = match.group(3);
          numerator = num?.trim();
          denominator = den?.trim();
        }
        
        if (numerator != null && denominator != null && numerator.isNotEmpty && denominator.isNotEmpty) {
          // 创建分数的富文本表示
          spans.add(
            WidgetSpan(
              child: _buildFractionWidget(numerator, denominator, safeStyle),
              alignment: PlaceholderAlignment.middle,
            ),
          );
        } else {
          // 如果提取失败，直接添加原文本
          final matchText = match.group(0);
          if (matchText != null && matchText.isNotEmpty) {
            spans.add(TextSpan(
              text: matchText,
              style: safeStyle,
            ));
          }
        }
        
        lastMatchEnd = match.end.clamp(0, text.length);
      }
      
      // 添加最后一部分文本
      if (lastMatchEnd < text.length) {
        final startIndex = lastMatchEnd.clamp(0, text.length);
        if (startIndex < text.length && startIndex >= 0) {
          try {
            spans.add(TextSpan(
              text: text.substring(startIndex),
              style: safeStyle,
            ));
          } catch (e) {
            // 如果substring失败，跳过这部分
            print('Error in final substring: $e, startIndex: $startIndex, text.length: ${text.length}');
          }
        }
      }
    } catch (e) {
      // 如果整个处理过程出错，返回普通文本
      print('Error in _buildRichText: $e');
      return _buildText(text, context);
    }
    
    // 如果没有任何spans，添加原始文本
    if (spans.isEmpty) {
      spans.add(TextSpan(
        text: text,
        style: safeStyle,
      ));
    }

    return Container(
      constraints: BoxConstraints(
        maxWidth: MediaQuery.of(context).size.width,
      ),
      child: RichText(
        text: TextSpan(
          style: safeStyle.copyWith(color: Colors.black),
          children: spans
        ),
        maxLines: maxLines,
        overflow: maxLines != null ? overflow : TextOverflow.visible,
        textAlign: TextAlign.left,
      ),
    );
  }
  
  // 构建分数小部件
  Widget _buildFractionWidget(String numerator, String denominator, TextStyle? baseStyle) {
    final defaultStyle = baseStyle ?? const TextStyle(color: Colors.black, fontSize: 16.0);
    final fontSize = defaultStyle.fontSize ?? 16.0;
    final fractionStyle = defaultStyle.copyWith(
      fontSize: fontSize * 0.9,
      color: defaultStyle.color ?? Colors.black, // 使用传入样式的颜色
    );
    
    return IntrinsicWidth(
      child: Column(
        mainAxisSize: MainAxisSize.min,
        crossAxisAlignment: CrossAxisAlignment.center,
        children: [
          // 分子
          Text(
            numerator,
            style: fractionStyle,
          ),
          // 分数线
          Container(
            height: 1.5,
            color: defaultStyle.color ?? Colors.black, // 使用传入样式的颜色
            width: double.infinity,
            margin: const EdgeInsets.symmetric(vertical: 2.0),
          ),
          // 分母
          Text(
            denominator,
            style: fractionStyle,
          ),
        ],
      ),
    );
  }
}